package com.dream.dk.Calorie;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;

import com.dream.dk.dto.diet.CaloriesInfoDto;

public class CalorieParser extends DefaultHandler {

	List<CaloriesInfoDto> list;
	List<CaloriesInfoDto> caloriesInfoList;
	CaloriesInfoDto caloriesInfoDto;
	
	private boolean idFlag;
	private boolean nameFlag;
	private boolean calFlag;

	public CalorieParser() {
		list = new ArrayList<CaloriesInfoDto>();
	}

	/**
	 * カロリーAPIのレスポンス結果をパースする
	 * 
	 * @param xml
	 * @return
	 */
	public List<CaloriesInfoDto> parseResponse(String xml) {

		caloriesInfoList = new ArrayList<CaloriesInfoDto>();

		try {
			// ファクトリを作成
			SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

			// xmlを検証
			saxParserFactory.setValidating(true);

			// SAXパーサーを取得
			SAXParser saxParser = saxParserFactory.newSAXParser();
			InputSource inputSource = new InputSource(new StringReader(xml));

			// xmlファイルをリード
			saxParser.parse(inputSource, this);
		} catch (Exception e) {

		}
		return caloriesInfoList;
	}

	/**
	 * xml解析開始時の通知
	 */
	public void startDocument() {
	}

	/**
	 * xml解析終了時の通知
	 * 
	 * @see org.xml.sax.helpers.DefaultHandler#endDocument()
	 */
	public void endDocument() {
	}

	/**
	 * 要素の開始通知
	 */
	public void startElement(String namespaceURI, String localName,
			String qName, Attributes atts) {
		if (qName.equals("id")) {
			idFlag = true;
		} else if (qName.equals("name")) {
			nameFlag = true;
		} else if (qName.equals("cal")) {
			calFlag = true;
		} 
	}

	/**
	 * 要素の終了通知
	 */
	public void endElement(String name) {
//		System.out.println("endElement" + name);
	}

	/**
	 * 要素の文字データ通知
	 */
	public void characters(char ch[], int start, int length) {
		if(idFlag){
			caloriesInfoDto = new CaloriesInfoDto();
			caloriesInfoDto.id = new String(ch, start, length);
			idFlag = false;
		}else if(nameFlag){
			caloriesInfoDto.name = new String(ch, start, length);
			nameFlag = false;
		}else if(calFlag){
			caloriesInfoDto.calorie = new String(ch, start, length);
			calFlag = false;
			caloriesInfoList.add(caloriesInfoDto);
		}
//		System.out.println("start characters : " + new String(ch, start, length));
	}

}
